Trafico de datos en tiempo de SARS-COV-II

Carlos Sebastian Madrigal Rodriguez

2/7/2021


logo

Tras el brote de la COVID-19, cada vez más personas trabajan, estudian y socializan desde sus casas. A lo largo de la cadena de valor de Internet, los operadores de comunicaciones, los proveedores de contenido y servicios en la nube, así como también los puntos de intercambio de Internet (IXP), han experimentado hasta un 60% más de tráfico de Internet en comparación con el tráfico previo al brote. En esta situación sin precedentes, la resiliencia y la capacidad de las redes de banda ancha se han vuelto aún más esenciales. consulte mas aqui

La base de datos proporcionada, nos brinda la cantidad de datos (en GB) que circulan a traves de distintos proveedores de servicios digitales por medio de su infraestructura de red. Este dataset contempla distintos provedores que pueden presentar correlacion entre ellos, por lo cual podrian ser omitidos para evitar estudiar informacion muy parecida en las series.

  #Lectura de los datos del archivo csv.
  datos_internet <- read.csv("Monitoreo de Tráfico de Internet_2.csv", header = TRUE,
                  sep = ",", check.names = FALSE)
  datos_internet <- datos_internet %>% select(Fecha, Proveedor, Trafico_Datos_Local)
  datos_internet <- mutate(datos_internet, Fecha = as.Date(Fecha, "%m/%d/%Y"), 
                           Trafico_Datos_Local = as.numeric(Trafico_Datos_Local))

De todos los proveedores, seleccionaremos a los 3 que mas datos generan de manera local asi como 1 de los que menos generan.

  #Grafica de area.
  ggplot(datos_internet, aes(x = Fecha, y = Trafico_Datos_Local)) +
  geom_area(aes(color = Proveedor, fill = Proveedor),
  alpha = 0.5, position=position_dodge(0.8)) +
  ggtitle("Trafico de datos durante la pandemia") +
  xlab("Mes 2020") +
  ylab("Datos en GB") +
  theme_minimal() +
  scale_color_manual(values=c("#00AFBB", "#E7B800", "#CC0000", "#006600", 
                              "#669999", "#00CCCC", "#660099", "#FC0066", 
                              "#AF9999", "#FE99FF", "#559955", "#A990CC", 
                              "#660099", "#CC0066")) +
  scale_fill_manual(values=c( "#00AFBB", "#E7B800", "#CC0000", "#006600", 
                              "#669999", "#00CCCC", "#660099", "#FC0066", 
                              "#AF9999", "#FE99FF", "#559955", "#A990CC", 
                              "#660099", "#CC0066"))

En este caso fueron seleccionados: Movistar, Unefon, Clarovideo y DirecTV.


Series de tiempo.

Vayamos a realizar un analisis ganeral de las series de tiempo que nos proporcionan los proveeedores de servicios. Tras observar cada una de las series, se puede llegar a un punto en comun, todas tienen puntos de inflexion cerca de los meses de Julio, Agosto y Enero, ya que estos son los meses de transicion de vacaciones a clases/trabajo o viceversa por parte de estudiantes o trabajadores; Por motivos de la pandemia, el regreso a labores se debe de realizar de manera puramente virtual y en algunos escasos casos de manera semipresencial. ¿A que va esto?, pues a que todo mundo ahorita depende de servicios de internet o de entretenimiento ya que por decreto oficial, nadie deberia de salir de su casa.

NOTA. Los datos atipicos de las graficas fueron “Normalizados”, sustituyendo el dato por el promedio del dato de un dia anterior con el de un dia posterior, esto con el fin de brindar un buen modelo de prediccion.

grafica_movi <- ggplot(movistar) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="green", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Movistar") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_movi)

Antes que nada, se debe aclarar que la compañia “Movistar” es una empresa de servicios telefonia movil, cuyo proposito es comunicar a los cientos de miles de mexicanos con el mundo exterior y de manera local. En esta grafica se puede observar el alce de la demanda de servicios telefonicos justo cuando empezo el periodo vacacional y una caida una vez se regreso a dias laborales.

grafica_une <- ggplot(une) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="yellow", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Unefon") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_une)

Como dato previo al analisis, se debe aclarar que la compañia “Unefon” es una empresa de servicios telefonia movil, cuyo proposito es comunicar a los cientos de miles de mexicanos con el mundo exterior y de manera local. En esta grafica se puede observar la misma demanda que tuvo movistar, pero con una mayor cantidad de usuarios asociados a esta telefonia al principio, tambien demuestra el alce de la demanda de servicios telefonicos justo cuando empezo el periodo vacacional y una caida una vez se regreso a dias laborales.

grafica_claro <- ggplot(claro) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="red", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Claro") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_claro)

Como dato previo, se debe aclarar que la compañia “Claro” es una empresa de servicios internet y telefonia fija, asi como servicios de entretenimiento en linea, cuyo proposito es de brindar un servicio total a sus clientes. En esta grafica se puede observar un cambio significativo con respecto a las empresas anteriores, como esta es una empresa mas orientado a lo “fijo” y al entretenimiento, por motivos de confinamiento agarro mas fuerza y tuvo un incremento desde el inicio de la pandemia; como las personas se la pasan en su hogar, necesitan una forma de pasar el tiempo y que mejor con los servicios de entretenimiento qye ofrece esta empresa y ademas, si estas en casa, no hay necesidad de tener un plan movil de internet si ya tienes internet fijo.

grafica_directv <- ggplot(directv) +
  geom_line(aes(x=Fecha, y= Trafico_Datos_Local), color="blue", size=0.8) +
  geom_point(aes(x=Fecha, y= Trafico_Datos_Local), size=1) +
  ggtitle("Directv") +
  labs(x="Tiempo", y="Datos (GB)") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
ggplotly(grafica_directv)

Como dato previo, se debe aclarar que la compañia “Directv” es una empresa de servicios de television por cable, cuyo proposito es de brindar canales exclusivos que no se pueden obtener a traves de television abierta a sus clientes. En esta grafica se puede observar un cambio significativo con respecto a las empresas anteriores, y un comportamiento casi contrario con respecto a Claro, ya que esta tambien provee servicio de entretenimiento, pero ¿Porque?. Muy facil!, el internet agarro gran fuerza, reemplazando asi la television abierta y por cable desde el momento en que salio y empresas exclusivas de entretenimiento que solo pueden ser visitados a traves de internet y de popularidad masiva, aprovecharon la pandemia para lanzar una gran cantidad de espectaculos, logrando asi que muchas personas que tenian television por cable, cancelaran el servicio porque en internet podian encontrar mas variedad y hasta los mismos programas por un precio mas barato o inclusive gratis!

Como breve conclusion de las graficas anteriores, Ante el confinamiento, los servicios de telefonía e internet fijos así como la TV de paga fueron los servicios que tomaron mayor fuerza al elevar sus ingresos y captar más clientes.


Modelos y Predicciones.

Es importante recordar que, al ajustar un modelo, los residuales de este deben comportarse como ruido blanco.

Movistar Para la empresa Movistar, realizamos la serie de tiempo, y utilizamos la función auto.arima para ajustar el mejor modelo posible a los datos. Para comprobar que es un buen modelo, hacemos el test Ljung-Box, obteniendo un p_value = 0.9735, por lo cual los residuales se comportan como ruido blanco, por lo que el modelo puede ser usado para predecir.

  ts_movistar = ts(movistar$Trafico_Datos_Local, start = c(2020,3,30),
                      end = c(2021,1,26), frequency = 300)

  #Suavizamos el modelo para obtener una mejor prediccion.
  ma_ts_movistar <- ma(ts_movistar,2)

  modelo_arima_movistar <- auto.arima(ma_ts_movistar)
  summary(modelo_arima_movistar)
  Series: ma_ts_movistar 
  ARIMA(3,1,4) with drift 
  
  Coefficients:
           ar1      ar2      ar3     ma1      ma2     ma3     ma4     drift
        0.9085  -0.5576  -0.3138  0.6828  -0.7544  0.3604  0.7987  441.9321
  s.e.  0.0655   0.0774   0.0654  0.0449   0.0890  0.1073  0.0536  642.1839
  
  sigma^2 estimated as 26776074:  log likelihood=-2954.69
  AIC=5927.39   AICc=5928.01   BIC=5960.6
  
  Training set error measures:
                     ME     RMSE      MAE        MPE      MAPE MASE        ACF1
  Training set 17.59574 5095.555 3995.632 0.01233925 0.7941021  NaN -0.07332442
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_movistar), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_movistar)
  X-squared = 1.613, df = 1, p-value = 0.2041
  #Ver si es un buen modelo.
  prediccion_movistar <- forecast(modelo_arima_movistar,10,level=95)
  plot(prediccion_movistar, main="Pronostico para Movistar.")

Este modelo presento un poco de problemas para ajustar un buen modelo, al aplicar medias moviles de orden 2, se obtuvo un un mejor ajuste pero no del todo excelente.

  ts_claro = ts(claro$Trafico_Datos_Local, start = c(2020,3,30),
              end = c(2021,1,26), frequency=305)
  modelo_arima_claro <- Arima(ts_claro, order = c(3,2,2))
  summary(modelo_arima_claro)
  Series: ts_claro 
  ARIMA(3,2,2) 
  
  Coefficients:
           ar1      ar2      ar3      ma1     ma2
        0.4597  -0.2298  -0.3165  -1.8154  0.8304
  s.e.  0.0623   0.0602   0.0597   0.0371  0.0367
  
  sigma^2 estimated as 4.065e+09:  log likelihood=-3770.64
  AIC=7553.28   AICc=7553.57   BIC=7575.54
  
  Training set error measures:
                      ME    RMSE      MAE        MPE     MAPE MASE        ACF1
  Training set -32.53311 63016.1 50555.39 -0.2353234 4.757215  NaN -0.08174628
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_claro), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_claro)
  X-squared = 2.0516, df = 1, p-value = 0.152
  #Ver si es un buen modelo.
  prediccion_claro <- forecast(modelo_arima_claro,10,level=95)
  plot(prediccion_claro, main="Pronostico para Claro")

  ts_unefon = ts(une$Trafico_Datos_Local,start = c(2020,3,30),
                     end = c(2021,1,26), frequency=305)
  modelo_arima_unefon <- auto.arima(ts_unefon)
  summary(modelo_arima_unefon)
  Series: ts_unefon 
  ARIMA(4,1,2) 
  
  Coefficients:
           ar1      ar2      ar3      ar4      ma1     ma2
        0.6498  -0.5720  -0.1813  -0.3071  -1.1905  0.7929
  s.e.  0.0707   0.0722   0.0674   0.0618   0.0471  0.0644
  
  sigma^2 estimated as 1.324e+09:  log likelihood=-3610.48
  AIC=7234.95   AICc=7235.33   BIC=7260.95
  
  Training set error measures:
                     ME     RMSE      MAE        MPE     MAPE MASE       ACF1
  Training set 106.0698 35969.85 28333.74 -0.1381419 3.491657  NaN -0.0307313
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_unefon), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_unefon)
  X-squared = 0.28994, df = 1, p-value = 0.5903
  #Ver si es un buen modelo.
  prediccion_unefon <- forecast(modelo_arima_unefon, 12, level=95)
  plot(prediccion_unefon, main="Pronostico para Unefon")

  ts_directv = ts(directv$Trafico_Datos_Local, start = c(2020,3,30),
                end = c(2021,1,26), frequency=305)
  modelo_arima_directv <- auto.arima(ts_directv, seasonal=TRUE)
  summary(modelo_arima_directv)
  Series: ts_directv 
  ARIMA(2,1,2) with drift 
  
  Coefficients:
           ar1     ar2      ma1     ma2    drift
        1.1069  -0.663  -1.3949  0.5808  -8.5755
  s.e.  0.0692   0.064   0.0727  0.0709  35.1089
  
  sigma^2 estimated as 3362602:  log likelihood=-2704.81
  AIC=5421.62   AICc=5421.9   BIC=5443.9
  
  Training set error measures:
                     ME     RMSE     MAE        MPE     MAPE MASE        ACF1
  Training set 11.12746 1815.554 1440.87 -0.0728653 2.683842  NaN -0.07059401
  #Ver si es un buen modelo.
  Box.test(residuals(modelo_arima_directv), type = 'Ljung-Box')
  
    Box-Ljung test
  
  data:  residuals(modelo_arima_directv)
  X-squared = 1.53, df = 1, p-value = 0.2161
  #Ver si es un buen modelo.
  prediccion_directv <- forecast(modelo_arima_directv, 12, level=95)
  plot(prediccion_directv, main="Pronostico para Directv")